//对阶模块，调整指数相同进入下一级模块
module add_align (
    input [7:0] exp1, exp2,        // 输入指数
    input s1,s2,
    input [23:0] mantissa1, mantissa2, // 输入尾数（隐藏位已添加）
    output [7:0] larger_exp,      // 对齐后的指数（取较大值）
    output [26:0] aligned_mantissa_s, // 对齐后的主尾数（保留24位含符号位）
    output [26:0] mantissa_out_s     //另一个尾数（未执行操作）
    //output reg sticky_bits_reg      // 被移出的低位（用于舍入）
);

    wire sign_align;
    wire sign_out;
/*     //wire [7:0] aligned_exp;      // 对齐后的指数（取较大值）
    wire [24:0] aligned_mantissa_s; // 对齐后的主尾数（保留24位含符号位）
    wire [24:0] mantissa_out_s;     //另一个尾数（未执行操作） */
    reg sticky_bit;                // 粘滞位


// =====================================
// 计算指数差和移位量
wire signed [8:0] exp_diff;
assign exp_diff = exp1 - exp2;
wire [7:0] shift ;
assign shift = (exp_diff > 0) ? exp_diff : -exp_diff; // 移位量（绝对值）
//wire [7:0] larger_exp ;
assign larger_exp = (exp_diff > 0) ? exp1 : exp2;     // 对齐后的指数

// =====================================
//  确定需要移位的尾数（较小指数的尾数）
wire [23:0] smaller_mantissa ;
assign smaller_mantissa = (exp_diff > 0) ?  mantissa2 : mantissa1;

assign sign_align = (exp_diff > 0)? s2 : s1;
assign sign_out = (exp_diff > 0)? s1:s2;

wire [26:0] adj_op_tmp;         // 临时尾数（原始尾数+3'b0）
assign adj_op_tmp = { smaller_mantissa, 3'b0 };
// =====================================
//  动态生成掩码并执行移位
/* // 生成掩码（捕获被移出的低位）
wire [23:0] mask ;
assign mask = (shift >= 24) ? 24'hFFFFFF : ((24'b1 << shift) - 1);
 */
/* // 移位后的尾数和被移出的位
wire [23:0] shifted_mantissa ;
assign shifted_mantissa = (shift >= 24) ? 24'b0 : (smaller_mantissa >> shift);
wire [23:0] shifted_out_bits ;
assign shifted_out_bits = (shift >= 24) ? smaller_mantissa : (smaller_mantissa & mask);
 */
    wire [4:0] exp_diff_sft;
    wire exp_lt_27;

    // 限制最大移位位数为27
    assign exp_lt_27 = (shift > 8'd27);
    assign exp_diff_sft = exp_lt_27 ? 5'd27 : shift[4:0];
// 右移操作
    wire [26:0] adj_op_out_sft;     // 移位后的尾数
    assign adj_op_out_sft = adj_op_tmp >> exp_diff_sft;

// 生成粘滞位（逻辑或所有被移出的低位）
    always @(exp_diff_sft or adj_op_tmp) begin
        case(exp_diff_sft)
            00: sticky_bit = 1'h0;
            01: sticky_bit = adj_op_tmp[0];
            02: sticky_bit = |adj_op_tmp[1:0];
            03: sticky_bit = |adj_op_tmp[2:0];
            04: sticky_bit = |adj_op_tmp[3:0];
            05: sticky_bit = |adj_op_tmp[4:0];
            06: sticky_bit = |adj_op_tmp[5:0];
            07: sticky_bit = |adj_op_tmp[6:0];
            08: sticky_bit = |adj_op_tmp[7:0];
            09: sticky_bit = |adj_op_tmp[8:0];
            10: sticky_bit = |adj_op_tmp[9:0];
            11: sticky_bit = |adj_op_tmp[10:0];
            12: sticky_bit = |adj_op_tmp[11:0];
            13: sticky_bit = |adj_op_tmp[12:0];
            14: sticky_bit = |adj_op_tmp[13:0];
            15: sticky_bit = |adj_op_tmp[14:0];
            16: sticky_bit = |adj_op_tmp[15:0];
            17: sticky_bit = |adj_op_tmp[16:0];
            18: sticky_bit = |adj_op_tmp[17:0];
            19: sticky_bit = |adj_op_tmp[18:0];
            20: sticky_bit = |adj_op_tmp[19:0];
            21: sticky_bit = |adj_op_tmp[20:0];
            22: sticky_bit = |adj_op_tmp[21:0];
            23: sticky_bit = |adj_op_tmp[22:0];
            24: sticky_bit = |adj_op_tmp[23:0];
            25: sticky_bit = |adj_op_tmp[24:0];
            26: sticky_bit = |adj_op_tmp[25:0];
            27: sticky_bit = |adj_op_tmp[26:0];
            default: sticky_bit = 1'h0;
        endcase
    end
    // =====================================
    // 合并移位后的尾数和粘滞位
    wire [26:0] adj_op_out;
    assign adj_op_out = {adj_op_out_sft[26:1], adj_op_out_sft[0] | sticky_bit};

    // =====================================
    // 输出对齐后的尾数和指数
    // =====================================
    // 主尾数（保持27位）
    assign aligned_mantissa_s = (exp_diff > 0) ? { mantissa1, 3'b0 } : adj_op_out;
    // 另一尾数（对齐后的27位）
    assign mantissa_out_s = (exp_diff > 0) ? adj_op_out : { mantissa2, 3'b0 };

/*     // =====================================
    // 流水线寄存器
    // =====================================
    always @(posedge clk) begin
        aligned_exp_reg      <= larger_exp;
        aligned_mantissa_s_reg <= aligned_mantissa_s;
        mantissa_out_s_reg   <= mantissa_out_s;
        //sticky_bits_reg       <= sticky_bit;
    end */
endmodule